package pokeronlab_2014;


/**
 * Az SVM hálók bemeneteként szolgáló adatstruktúra, adott
 *         pillanathoz tartozik
 *         
 * @author andras 
 * 
 */
public class SVMClassifierData {

	/**
	 * A játékban részt vevő játékosok ID-jei szék szerint
	 */
	public int[] playerIDs = new int[10];
	/**
	 * A preflopon,flopon,turnon,riveren történt cselekvések összegei: 4 kör,
	 *  10 szék, és 3 lehetőség van, ezeket összegezzük minden székre
	 *  fold, check/call, raise sorrendbe. A fold helyén ha -1 van azt jelenti hogy a játékos all-in van
	 */
	int[] playerData = new int[4 * 10 * 3];
	/**
	 * A játékosok kézerősségei, a Meerkat API-ban található függvénnyel
	 * számolva
	 */
	int[] playerHandStrengths = new int[10];
	/**
	 * A leosztott lapokról (boardról) vett featurek
	 */
	int[] boardFeatures = new int[6];
	
	/**
	 * A jelenlegi kör száma
	 */
	int stage;
	
	public SVMClassifierData copy() {
		//a clone shallow copyzik, de hívható az 1D-s int tömbökre pont ezért
		SVMClassifierData copy = new SVMClassifierData();
		copy.playerIDs = playerIDs.clone();
		copy.playerData = playerData.clone();
		copy.playerHandStrengths = playerHandStrengths.clone();
		copy.boardFeatures = boardFeatures.clone();
		return copy;
	}
	
	public void setPlayerData(int round, int player, int action){
		playerData[round*30+player*3+action]++;
	}
	
//	void setPlayerAllIN(int round, int player, int action){
//		playerData[round*30+player*3+action]=-1;
//	}
	
	/**
	 * @param PlayerID
	 * @return visszaadja hogy az PlayerID ID-vel rendelkező játékos hol ül
	 */
	public int getPlayerSeat(int PlayerID){
		for(int i=0; i<10; i++){
			if(playerIDs[i]==PlayerID){
				//Controller.debugWindow.printMessage("SVMClassifierData.getPlayerSeat OK");
				return i;
			}
		}
		
		String tmp = "PlayerID=" + PlayerID;
		Controller.debugWindow.printMessage("SVMClassifierData.getPlayerSeat -1");
		Controller.debugWindow.printMessage(tmp);
		return -1;
	}
	
	
	public boolean ingame(int Playerseat){
		for(int i=0; i<4;i++)
			if(playerData[i*30+Playerseat*3]==1 || playerData[i*30+Playerseat*3]==-1)
				return false;
		return true;
	}
	public boolean allin(){
		for(int i=0; i<4;i++)
			for(int j=0; j<10; j++)
				if(playerData[i*30+j*3]==-1)
					return true;
		return false;
	}

	/**
	 * Visszaad egy egész értéket az adatstruktúrából, index
	 * alapján
	 * 
	 * @param j A lekért adat indexe
	 * @return A lekért adat
	 */
	public int getIntData(int j) {
		if(j<10){
			return playerIDs[j];
		}else if(j<130){
			return playerData[j];
		}else if(j<140){
			return playerHandStrengths[j];
		}else{
			return boardFeatures[j];
		}
	}
}
